package top.jacktgq.sxt.bio.ChatRoom.version4;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author CandyWall
 * @Date 2019/10/22--18:45
 * @Description 在线聊天室：服务器
 *              目标：使用多线程实现一个服务器可以正常收发多条消息
 *              问题：1、代码不好维护
 *                   2、客户端读写没有分开 必须先写后读
 */
public class ChatServer {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器启动...");
        //1、指定端口 使用ServerSocket创建服务器
        ServerSocket serverSocket = new ServerSocket(8888);
        Boolean isUsedForMultiClients = true;   //是否服务于多个客户端
        while (isUsedForMultiClients) {
            //2、阻塞式等待连接accept
            Socket server = serverSocket.accept();
            System.out.println("一个客户端建立了连接");
            new Thread(() -> {
                //3、接收客户端发送的消息
                DataInputStream dis = null;
                DataOutputStream dos = null;
                try {
                    dis = new DataInputStream(server.getInputStream());
                    dos = new DataOutputStream(server.getOutputStream());
                    boolean isRunning = true;
                    while (isRunning) {
                        String content = dis.readUTF();
                        System.out.println("客户端发来：" +  content);
                        //4、返回消息
                        dos.writeUTF(content);
                        dos.flush();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

                //释放资源
                try {
                    if (dis == null) {
                        dis.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    if (dos == null) {
                        dos.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    if (server == null) {
                        server.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
        serverSocket.close();
    }
}
